ucomisd と NaN
ucomisd(Unordered Compare Scalar Double-Precision Floating-Point)
2つの倍精度浮動小数点値を比較し、結果を EFLAGS に反映する命令
code: asm
ucomisd xmm0, xmm1
NaN が絡む場合の EFLAGS
オペランドのどちらか一方(または両方)が NaN の場合、"unordered" 判定となり、以下のフラグが立つ
table: EFLAGS for Nan
フラグ NaN あり(unordered) 通常比較
ZF 1 状況による
PF 1 0
CF 1 状況による
PF(Parity Flag)が NaN の検出キー
通常の整数演算では PF はパリティを示すが、浮動小数点比較命令では PF=1 が "unordered"(=NaN が絡む) を意味する。
条件分岐との対応
table:condition and instruction
条件 使う命令 意味
a > b(ordered) ja(CF=0 & ZF=0) NaN なら不成立
a < b(ordered) jb(CF=1) NaN なら成立してしまう⚠️
a == b je(ZF=1) NaN なら成立してしまう⚠️
unordered jp(PF=1) NaN 検出
ordered jnp(PF=0) NaN でないことを確認
NaN-safe な比較パターン
code:asm
; a != b (NaN-safe: NaN のとき "not equal" と扱う)
ucomisd xmm0, xmm1
jne .not_equal
jp .not_equal ; NaN の場合も not_equal へ
; equal
code:asm
; a == b (NaN-safe)
ucomisd xmm0, xmm1
jp .not_equal ; NaN は即 not_equal
jne .not_equal
; equal
comisd との違い
table:comisd との違い
命令 NaN 時の動作
ucomisd NaN でも例外を発生させない(#IA をマスク)
comisd #IA(Invalid Operation)例外を発生させる可能性あり